<?php
	/**
	  * @package	MyTools
	  * @name		Bytes
	  * @brief		Clase para obtener un valor en KB, MB, etc..
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2010-01-13
	  * @version	0.1.1
  	**/

	final class Bytes extends MyDebuger {
		/* version de la clase */
		private static $version			= 0;
		/* subversion de la clase */
		private static $subversion		= 1;
		/* numero de revision de la clase */
		private static $revision		= 0;

		/* atributo con los posibles valores */
		private $types		= Array('Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB', 'BB', 'GeB');
		/* valor a convertir */
		private $bytes		= 0;
		/* resultado final */
		private $result	= '';
		/* temporal */
		private $counter	= 0;

		public function __construct($debug = False) {
			/* creamos el padre */
			parent::__construct($debug, __CLASS__);
		}

		public function __destruct() {
			/* matamos el padre */
			parent::__destruct();
		}

		public static final function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		/* Metodo estatico para realizar la conversion */
		public static function convert($bytes, $debug = False) {
			/* creamos el objeto */
			$conv = new Bytes($debug);
			/* convertimos la cantidad y la devolvemos */
			return $conv->convertir($bytes);
		}

		public function convertir($bytes) {
			/* almacenamos el valor */
			$this->almacenar($bytes);
			/* convertimos el valor */
			$this->convertirCantidad();
			/* mostramos la cantidad final */
			$this->show('Resultado final: ' . $this->result);
			/* retornamos el valor convertido */
			return $this->result;
		}

		private function almacenar($bytes) {
			/* mostramos un mensaje */
			$this->show('Almacenando valor ' . $this->italic($bytes) . '..', False);
			/* guardamos el valor a convertir */
			$this->bytes = $bytes;
			/* mostramos OK al mensaje */
			$this->showOK();
		}

		private function convertirCantidad() {
			/* dividimos el numero */
			$this->dividir();
			/* realizamos el formateo del numero */
			$this->formatear();
			/* agregamos la sigla de tamano */
			$this->agregarSigla();
		}

		private function dividir() {
			/* mostramos un mensaje */
			$this->show('Realizando reduccion de cantidad..', False);
			/* recorro el valor hasta que no se pueda dividir por 1024 */
			for (
				$this->counter = 0;
				$this->bytes >= 1024 && $this->counter < (count($this->types) - 1);
				$this->bytes /= 1024, $this->counter++
			);
			/* mostramos OK al mensaje */
			$this->showOK();
		}

		private function formatear() {
			/* mostramos un mensaje */
			$this->show('Formateando cantidad..', False);
			/* formateamos el numero asignandole dos decimales */
			$this->result = number_format($this->bytes, ($this->counter == 0 ? 0 : 2), ",", ".");
			/* mostramos OK al mensaje */
			$this->showOK();
		}

		private function agregarSigla() {
			/* mostramos un mensaje */
			$this->show('Agregando sigla..', False);
			if ($this->counter != 0 || $this->result != 1)
				/* agregamos la sigla */
				$this->result .= ' ' . $this->types[$this->counter];
			elseif ($this->result == 1)
				/* si el resultado es 1 (uno) agregamos la sigla 'Bytes' sin la ese */
				$this->result .= ' ' . substr($this->types[$this->counter], 0, -1);
			/* mostramos OK al mensaje */
			$this->showOK();
		}
	}
?>